package test;
/***********************************************************************/
/* Copyright (c) 1999-2005, The Rector and Board of Visitors of the    */
/* University of Virginia.                                             */
/* All rights reserved.                                                */
/*                                                                     */
/* This program is being made available under the terms of version 2.1 */
/* of theGNU Lesser General Public License ("LGPL") as published as of */
/* February, 1999 by the Free Software  Foundation; and subject to the */
/* restrictions of the LGPL, you are authorized to  modify and/or      */
/* redistribute it.                                                    */
/*                                                                     */
/* As stated in the LGPL, THIS PROGRAM IS BEING MADE AVAILABLE "AS IS",*/
/* AND WITHOUT A WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,    */
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF            */
/* MERCHANTABILITY AND  FITNESS FOR A PARTICULAR PURPOSE. FURTHER, YOU */
/* AGREE NOT TO HOLD THE COPYRIGHT  OWNER(S) LIABLE FOR DAMAGES,       */
/* INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,*/
/* ARISING OUT OF THE USE OR INABILITY TO USE  THE PROGRAM.            */
/* See the GNU General Public License for more details.                */
/*                                                                     */
/* You should have received a copy of version 2.1 of the GNU General   */
/* Public License along with this program; if not, you may obtain a    */
/* copy  from the Free Software Foundation website at the following URL*/
/* address (link  active as of September 1, 2005):                     */
/* http://www.fsf.org/licensing/licenses/lgpl.html; or that failing,   */
/* you can request a copy from Free Software Foundation,  Inc., 51     */
/* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.                */
/*                                                                     */
/* This program is part of the HyperCast software distribution. To     */
/* learn more about HyperCast, please visit the website at             */
/* http://www.hypercast.org.                                           */
/***********************************************************************/

/** HelloWorld_Unicast 
 *
 *       The HyperCast HelloWorld programs demonstrate various aspects of
 *       the HyperCast API.  The programs create an overlay socket that 
 *       sends and receives messages. 
 *
 *       In HelloWorld_Unicast, the program receives multicast messages, extracts
 *       the source address, and sends a unicast message to the source of the message.
 *       The program assumes that there is another program that sends multicast messages.
 *       This file corresponds to an example program in the HyperCast API description 
 *       (see Chapter:  "API - The Basics", Section: "Sending Overlay Messages"). 
 *
 * @author HyperCast Team
 * @version 2005 (version 3.0)
 *
 */


import hypercast.*;

public class HelloWorld_Unicast implements I_ReceiveCallback {
	
    // The overlay socket 
    I_OverlaySocket MySocket = null;

    // The configuration object
    HyperCastConfig ConfObj = null;
    
public static void main(String[] args) {
    	
    	// Create a new HelloWorld_CallBack instance 
    	new HelloWorld_Unicast();
}
    
public void ReceiveCallback (I_OverlayMessage msg) {
		
	
	//	 Extract the payload and the logical address of the source
	byte[] data = msg.getPayload();
	String Payload = msg.getPayload().toString();
    String Src = msg.getSourceAddress().toString();

    // Print the payload (Skip messages sent by this program) 
    System.out.println("Received <"+ Payload + "> from logical address: " + Src + ".");

	
		
		// Manipulate payload a little and convert to message
		String  returnmsg = "Returned from " + Src + ": " +new String(data);
        byte[] MyData = returnmsg.getBytes();
		
        // Create a message
		I_OverlayMessage MyMessage = MySocket.createMessage(MyData);

		// Return payload as a unicast message 
		MySocket.sendToNode(MyMessage,msg.getSourceAddress());
		System.out.println("<HelloWorld> message returned to source ...");

}
		
public  HelloWorld_Unicast () {
	
	//	Create a configuration object
	ConfObj = HyperCastConfig.createConfig("hypercast.xml");

	// Create an overlay socket with the configuration object
	MySocket=ConfObj.createOverlaySocket(this);

	// Join the overlay network 
	MySocket.joinOverlay();

	// Print the logical address */ 
	String MyLogicalAddress = MySocket.getLogicalAddress().toString();
	System.out.println("Logical address is " + MyLogicalAddress + ".");
	
}
}